package com.jiyun.home.service.impl;

import com.jiyun.Result.Result;
import com.jiyun.common.pojo.product.OrderInfo;
import com.jiyun.home.OrderFeign;
import com.github.wxpay.sdk.WXPayUtil;
import com.jiyun.common.util.HttpClient;
import com.jiyun.home.StandardFeign;
import com.jiyun.home.mapper.TradeMapper;
import com.jiyun.home.service.WxPayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
@Slf4j
public class WxPayServiceImpl implements WxPayService {
    @Autowired
    private OrderFeign ordersFeign;
    @Autowired
    private StandardFeign standardFeign;

    /**
     * 生成二维码链接地址
     * 该方法通过调用微信支付统一下单接口，获取生成二维码所需的链接地址
     *
     * @param trade 订单号，用于标识每一笔交易
     * @return 返回二维码链接地址
     * @throws Exception 当网络请求失败或解析响应出错时抛出异常
     */
    @Override
    public Result getQrCodeUrl(String trade) throws Exception {
//        OrderInfo orderInfo= ordersFeign.findByOrderNumber(trade);
        // 创建HttpClient对象，设置请求URL为微信支付统一下单接口
        HttpClient httpClient = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
        httpClient.setHttps(true);

        // 封装微信支付统一下单接口所需的必填参数
        Map<String, String> map = new HashMap<>();
        map.put("appid", "wxab8acb865bb1637e"); // 公众账号ID
        map.put("mch_id", "11473623"); // 商户号
        map.put("nonce_str", WXPayUtil.generateNonceStr()); // 随机字符串
        map.put("body", "会员VIP充值"); // 商品描述
        map.put("out_trade_no", trade); // 订单号
        map.put("total_fee", "1"); // 总金额，单位为分
        map.put("spbill_create_ip", "127.0.0.1"); // 终端IP
        map.put("notify_url", "127.0.0.1"); // 通知地址
        map.put("trade_type", "NATIVE"); // 交易类型
        // 生成签名并转换为XML格式参数
        String xmlParam = WXPayUtil.generateSignedXml(map, "2ab9071b06b9f739b950ddb41db2690d");
        httpClient.setXmlParam(xmlParam);
        // 发送POST请求
        httpClient.post();
        // 获取响应内容并解析为Map
        String result = httpClient.getContent();
        Map<String, String> resultMap = WXPayUtil.xmlToMap(result);
        // 提取二维码链接地址
        String codeUrl = resultMap.get("code_url");
        System.out.println("获取到的二维码链接地址为：" + codeUrl);


        return Result.ok(codeUrl);
    }

    @Autowired
    TradeMapper tradeMapper;


    /**
     * 查询订单状态
     * 该方法通过调用微信支付订单查询接口，获取订单的当前状态，并更新或添加订单信息到数据库
     *
     * @param orderInfo 订单信息对象
     * @return 返回订单的交易状态
     * @throws Exception 当网络请求失败或解析响应出错时抛出异常
     */
    @Override
    public String orderquery(OrderInfo orderInfo, Integer id) throws Exception {
        // 调用findResult方法查询订单状态
        String result = findResult(orderInfo, id);
        return result;
    }

    /**
     * 循环查询订单状态
     * 该方法在一分钟内每5秒请求一次微信支付订单查询接口，直到订单状态为SUCCESS或超时
     *
     * @param orderInfo 订单信息对象
     * @return 返回订单的交易状态
     * @throws Exception 当网络请求失败或解析响应出错时抛出异常
     */
    public String findResult(OrderInfo orderInfo, Integer id) throws Exception {
        String result = "";
        int i = 0;
        System.out.println("调用了订单查询接口");
        log.info("id:{}", id);
        // 在一分钟内每5秒请求一次订单查询接口
        while (true) {
            String orderStatus = findTrade(orderInfo.getOrderNumber());

            if (orderStatus == null) {
                result = "fail";
                System.out.println("支付出错，停止请求");
                break;
            }

            if ("SUCCESS".equals(orderStatus)) {
                result = "success";
                System.out.println("支付成功，停止请求");
                orderInfo.setStatus("2");
                if (id != null) {
//                    订单+1
                    ordersFeign.update(id);
                    standardFeign.update(id);
                    log.info("id:{}", id);
                } else {
                    AddOrderInfo(orderInfo);
                }
                break;
            } else {
                i++;
                System.out.println("支付中，第" + i + "次请求");
                Thread.sleep(5000);
            }

            if (i == 12) {
                result = "timeout";
                System.out.println("支付超时，停止请求");
                if (id == null) {
                    orderInfo.setStatus("1");
                    AddOrderInfo(orderInfo);
                }
                break;
            }
        }

        return result;
    }

    /**
     * 查询订单状态
     * 该方法通过调用微信支付订单查询接口，获取订单的当前状态
     *
     * @param trade 订单号
     * @return 返回订单的交易状态
     * @throws Exception 当网络请求失败或解析响应出错时抛出异常
     */
    public String findTrade(String trade) throws Exception {
        // 创建HttpClient对象，设置请求URL为微信支付订单查询接口
        HttpClient httpClient = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
        httpClient.setHttps(true);

        // 封装微信支付订单查询接口所需的必填参数
        Map<String, String> map = new HashMap<>();
        map.put("appid", "wxab8acb865bb1637e"); // 公众账号ID
        map.put("mch_id", "11473623"); // 商户号
        map.put("nonce_str", WXPayUtil.generateNonceStr()); // 随机字符串
        map.put("out_trade_no", trade); // 订单号

        // 生成签名并转换为XML格式参数
        String xmlParam = WXPayUtil.generateSignedXml(map, "2ab9071b06b9f739b950ddb41db2690d");
        httpClient.setXmlParam(xmlParam);

        // 发送POST请求
        httpClient.post();

        // 获取响应内容并解析为Map
        String result = httpClient.getContent();
        System.out.println(result);
        Map<String, String> resultMap = WXPayUtil.xmlToMap(result);

        // 提取交易订单状态
        String trade_state = resultMap.get("trade_state");
        System.out.println("获取到的交易订单状态为：" + trade_state);

        return trade_state;
    }

    /**
     * 添加或更新订单信息
     * 该方法通过调用OrderFeign接口，将订单信息添加或更新到数据库
     *
     * @param orderInfo 订单信息对象
     */
    public void AddOrderInfo(OrderInfo orderInfo) {
        ordersFeign.Add(orderInfo);
    }


}
